// 路由鉴权 某一个路由什么条件下才能访问
import router from '@/router'
// @ts-ignore
import nprogress from 'nprogress'
// 引入setting组件->设置title
import Setting from './setting'
// 引入样式
import 'nprogress/nprogress.css'
import useUserStore from './store/modules/user'
const userStore = useUserStore(pinia)
import pinia from './store'
import { ElMessage } from 'element-plus'

// 全局前置守卫
router.beforeEach(async (to: any, _from: any, next: any) => {
  // 在访问路由之前的守卫
  nprogress.start()
  // 禁用圆圈效果
  nprogress.settings.showSpinner = false
  // 获取token
  // 获取用户名字
  const name = userStore.userName
  // 判断是否有token
  const token = userStore.token
  if (token) {
    if (to.path === '/login') {
      // 登录页跳转到首页
      ElMessage.warning('已登录，无需再次登录')
      next({ path: '/' })
    } else {
      // 保证有用户信息
      if (!name) {
        // 没有的话发请求
        try {
          await userStore.getUserInfo()
          // 万一刷新的时候是异步路由 ，用户信息未加载完毕，会出现空白
          next({ ...to })
        } catch (error) {
          // 请求失败执行
          ElMessage.error('获取用户失败')
          // 没有用户信息就跳转 token过期||手动修改token
          // 退出登录
          try {
            await userStore.logout()
            // 跳转登录页
            next({
              path: '/login',
              query: {
                // 重定向
                redirect: to.path,
              },
            })
          } catch (error) {
            console.log(error)
          }
        }
      } else {
        next()
      }
    }
  }
  // 未登录
  else {
    if (to.path == '/login') {
      next()
    } else {
      next({
        path: '/login',
        query: {
          // 重定向
          redirect: to.path,
        },
      })
    }
  }
})

// 全局后置守卫
router.afterEach((to: any, _from: any) => {
  // 添加标题
  document.title = Setting.title + '_' + to.meta.title
  nprogress.done()
})

// 第一个问题，任意路由间切换实现进度条业务

// 第二个问题：路由鉴权
//  1.设置公共路由白名单
//  2.判断to路由是否在白名单中 const whiteList = ['login', 'register']; indexof||includes
//  3.判断是否登录，未登录可以访问login、404，其余路由均定向到login 登录的可以访问全部 重定向到首页
